
package servidor.bbdd;

import common.*;
import common.EOlympicsException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.sql.Statement;


/**
 * Clase que gestiona la conexion y desconexion a la base de datos.
 * @version 1.a; 15-11-2010; java version "1.6.0";
 * @author José moreno
 */
public class GestorDiscoConexion {
    //Declaramos la variable de conexion

    protected Connection conexion = null;
    
    /**
     * Método que crea la conexion a la BD indicada en el fichero de propiedades
     * @exception EOlympicsException
     */
    public void conectarBD() throws EOlympicsException {
        String url = "";
        String usuario = "";
        String clave ="";
        //Recogemos excepciones
        try {
            Class.forName("org.postgresql.Driver");
            //no se ha encontrado la clase
        } catch (ClassNotFoundException e) {
            //crea nueva excepción personalizada
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DRV);
        }
        try {
            Properties prop = new Properties();
            //leemos el fichero properties
            final String propertiesFile = new File("").getAbsolutePath() + "/properties/configuration.properties";
            prop.load(new FileInputStream(propertiesFile));
            url = prop.getProperty("url");
            usuario = prop.getProperty("username");
            clave = prop.getProperty("password");
            //no se encuentra el archivo
        } catch (java.io.FileNotFoundException e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_NOT_FILE);
        } catch (IOException ioe) {
            System.out.println(ioe.getMessage());
            //error al leer el fichero de propiedades
            throw new EOlympicsException(EOlympicsException.ERR_PROPERTIES);
        }
       
        try {
            conexion = DriverManager.getConnection(url, usuario, clave);
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_CONECTION);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_CONECTION);
        }
    }

    /** Método sin parámetros que crea una sentencia para manipular la base de datos.<br>
     * {pre: existe una conexion a la base de datos.}<br>
     * {post: crea una sentencia que manipulará la base de datos.}
     * @return Statement - la sentencia creada.
     * @exception EOlympicsException
     */
    public Statement crearSentencia() throws EOlympicsException {
        Statement sentencia = null;
        try {
            sentencia = conexion.createStatement();
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_CONECTION);
        }
        return sentencia;
    }

    /** Método que crea un Prepared Statement para manipular la base de datos.<br>
     * {pre: existe una conexion a la base de datos.}<br>
     * {post: crea una sentencia que manipulará la base de datos.}
     * @return PreparedStatement - la sentencia creada.
     * @exception EOlympicsException
     */
    public PreparedStatement crearPreparedStatement(String ps) throws EOlympicsException {
        try {
            return conexion.prepareStatement(ps, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_CONECTION);
        }
    }

    /** Método sin parámetros que provoca la desconexion a la base de datos.<br>
     * {pre: existe una conexion a una base de datos}<br>
     * {post: desconectada la aplicacion de la base de datos}<br>
     * @exception EOlympicsException
     */
    public void cerrarConexionBD() throws EOlympicsException {
        try {
            conexion.close(); //cierra la conexion
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_BD_STOP);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_BD_STOP);
        }
    }

    /** Método sin parámetros que obtiene la conexion actual a la base de datos.
     * {pre: existe una conexion a una base de datos}
     * {post: obtiene la conexion.}
     * @return Connection - la conexion a la base de datos.
     * @exception EOlympicsException
     */
    public Connection getConexion() throws EOlympicsException {
        return conexion;
    }

    /** Método con un parámetro que asigna la conexion actual a la base de datos.
     * {pre: la base de datos está correctamente configurada}
     * {post: ha asignado la conexion.}
     * @exception EOlympicsException
     */
    public void setConexion(Connection pConexion) throws EOlympicsException {
        conexion = pConexion;
    }
}
